#Использовать osparser
#Использовать cmdline

Перем ТекущийМодуль;
Перем Парсер;
Перем Расположение;
Перем СПодкаталогами;
Перем КаталогДокументации;
Перем КаталогЛокализации;
Перем КаталогЛогов;
Перем КаталогПримеров;
Перем КаталогЗначений;
Перем КаталогCLI;
Перем СписокОбластей;
Перем ТекущаяОбласть;
Перем СчетчикОбласти;
Перем Словарь;
Перем Транслитация;
Перем СчетчикБиблиотеки;
Перем СоответствиеЗаголовков;

Процедура ПриСозданииОбъекта()  

	Расположение        = "./src/ru/OInt";
	СПодкаталогами      = Истина;
	КаталогДокументации = "./docs/ru/md";
	КаталогЛокализации  = "./docs/en/md";
	КаталогЛогов        = "./docs/ru/results/";
	КаталогПримеров     = "./docs/ru/examples/";
	КаталогЗначений     = "./docs/ru/data/";
	КаталогCLI          = "./docs/ru/cli/";
	ПутьКСловарю        = "./service/dictionaries/en.json";
	СписокОбластей      = Новый СписокЗначений();
	ТекущаяОбласть      = "";
	СчетчикОбласти      = 0;

	СоответствиеЗаголовков = Новый Соответствие();

	ЧтениеJSON = Новый ЧтениеJSON();
	ЧтениеJSON.ОткрытьФайл(ПутьКСловарю);
	Словарь = ПрочитатьJSON(ЧтениеJSON, Истина);
	ЧтениеJSON.Закрыть();

	ПолучитьТаблицуТранслитации();
	ПроверитьСоздатьКаталог(КаталогДокументации);
    СоздатьФайлыДокументации();
	
	ПеревестиДокументацию();


КонецПроцедуры

#Область СлужебныеПроцедурыИФункции

#Область ФормированиеДокументации

Процедура СоздатьФайлыДокументации()

    ОбщийМассивМодулей = Новый Массив;
	ФайлыМодулей       = НайтиФайлы(Расположение, "*.os", СПодкаталогами);

	Для Каждого Модуль Из ФайлыМодулей Цикл

		Если Модуль.ИмяБезРасширения = "OPI_YandexID" 
			Или Модуль.ИмяБезРасширения = "OPI_GoogleWorkspace" Тогда
			Продолжить;
		КонецЕсли;
		
		ОбщийМассивМодулей.Добавить(Модуль);
	КонецЦикла;

    Для Каждого Модуль Из ОбщийМассивМодулей Цикл

        ТекущийМодуль = Новый ТекстовыйДокумент();
		ТекущийМодуль.Прочитать(Модуль.ПолноеИмя);
        РазобратьМодуль(ТекущийМодуль, Модуль.ИмяБезРасширения);
	  
    КонецЦикла;

КонецПроцедуры

Процедура СоздатьСтраницуДокументации(СтруктураМетода, Счетчик = 1)

	Раздел    = СтрЗаменить(СтруктураМетода["Каталог"], "_", "");
	Результат = ПолучитьРезультатМетода(Раздел, СтруктураМетода["ИмяМетода"]);
	Область   = СтруктураМетода["Область"];

	Если ТекущаяОбласть <> Область Тогда
		ТекущаяОбласть = Область;
		СчетчикОбласти = 1;
		СчетчикБиблиотеки = СчетчикБиблиотеки + 1;
	КонецЕсли;

	ТранслитированноеИмя     = ПеревестиИмя(СтруктураМетода["ИмяМетода"]);
	ТранслитированнаяОбласть = ПеревестиИмя(Область);

	ТранслитированноеИмя     = СтрЗаменить(Синонимайзер(ТранслитированноеИмя), " ", "-");
	ТранслитированнаяОбласть = СтрЗаменить(Синонимайзер(ТранслитированнаяОбласть), " ", "-");

	СинонимОбласти   = СтрЗаменить(ТранслитированнаяОбласть, "-", " ");
	ЗаголовокОбласти = Синонимайзер(Область);

	СоответствиеЗаголовков.Вставить(ЗаголовокОбласти, СинонимОбласти);
	
	ИмяМодуляБезПрефикса     = СтрЗаменить(СтруктураМетода["ИмяМодуля"], "OPI_", "");

	КаталогБиблиотеки = КаталогДокументации + "/" + СтруктураМетода["Каталог"];
	КаталогОбласти    = КаталогБиблиотеки + "/" + ТранслитированнаяОбласть;
	КаталогКартинок   = КаталогОбласти + "/" + "img";
	ПутьДанных        = КаталогЗначений + ИмяМодуляБезПрефикса + "/" + СтруктураМетода["ИмяМетода"] + ".json";
	ФайлДанных        = Новый Файл(ПутьДанных);

	Если ФайлДанных.Существует() Тогда
		ЧтениеJSON = Новый ЧтениеJSON();
		ЧтениеJSON.ОткрытьФайл(ПутьДанных);
		СтруктураЗначений = ПрочитатьJSON(ЧтениеJSON, Истина);
		ЧтениеJSON.Закрыть();
	Иначе
		СтруктураЗначений = Новый Соответствие();
	КонецЕсли;

	ПроверитьСоздатьКаталог(КаталогБиблиотеки);
	ПроверитьСоздатьКаталог(КаталогОбласти);
	ПроверитьСоздатьКаталог(КаталогКартинок);

	СтруктураКатегории = Новый Структура("label,position", ЗаголовокОбласти, Строка(СчетчикБиблиотеки));
	ФайлКатегории      = КаталогОбласти + "/_category_.json";

	Запись = Новый ЗаписьJSON;
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);
	Запись.ОткрытьФайл(ФайлКатегории, , , ПараметрыЗаписиJSON);
	ЗаписатьJSON(Запись, СтруктураКатегории);
	Запись.Закрыть();
	
	Макет = Новый ТекстовыйДокумент();
	Макет.Прочитать("./.github/workflows/os/template.md", "UTF-8");

	Макет = Макет.ПолучитьТекст();

	Макет = СтрЗаменить(Макет, "@Счетчик"             , Строка(СчетчикОбласти));
	Макет = СтрЗаменить(Макет, "@Заголовок"           , СтруктураМетода["Заголовок"]);
	Макет = СтрЗаменить(Макет, "@Описание"            , СтруктураМетода["Описание"]);
	Макет = СтрЗаменить(Макет, "@Объявление"          , СтруктураМетода["Объявление"]);
	Макет = СтрЗаменить(Макет, "@ВозвращаемоеЗначение", СтруктураМетода["ВозвращаемоеЗначение"]);
	Макет = СтрЗаменить(Макет, "@Результат"           , Результат);

	ТаблицаПараметров = "";
	Вызов1С           = ПолучитьВызов1С(СтруктураМетода["ИмяМодуля"], СтруктураМетода["ИмяМетода"]);

	ПутьCLI  = КаталогCLI + ИмяМодуляБезПрефикса + "/" + СтруктураМетода["ИмяМетода"] + ".txt";
	ФайлCLI  = Новый Файл(ПутьCLI);
	ВызовCLI = "";

	Если Не ФайлCLI.Существует() Тогда
		
		КаталогТекущиегоCLI  = КаталогCLI + ИмяМодуляБезПрефикса;
		ФайлКаталога = Новый Файл(КаталогТекущиегоCLI);

		Если Не ФайлКаталога.Существует() Тогда
			СоздатьКаталог(КаталогТекущиегоCLI);
		КонецЕсли;

		ВызовCLI = "oint " + СтруктураМетода["Команда"] + " " + СтруктураМетода["ИмяМетода"];

		Для каждого ПараметрМетода Из СтруктураМетода["Параметры"] Цикл
			
			Если Не ЗначениеЗаполнено(ПараметрМетода.Опция) Или Не СтруктураМетода["ЕстьCLI"] Тогда
				Сообщить("Метод не имеет опции: " + СтруктураМетода["Заголовок"]);
				Возврат;
			КонецЕсли;

			ТаблицаПараметров = ТаблицаПараметров + "  | " 
				+ ПараметрМетода.Имя + " | "
				+ ПараметрМетода.Опция + " | "
				+ ПараметрМетода.Типы  + " | "
				+ ПараметрМетода.Описание + " |"
				+ Символы.ПС;

			ВызовCLI = ВызовCLI + " " + ПараметрМетода.Опция + " ";
			ВызовCLI = ВызовCLI + ОпределитьЗначениеОпции(ПараметрМетода.Опция, СтруктураЗначений[ПараметрМетода.Имя]);

		КонецЦикла;
	
		ВызовCLI = СокрЛП(ВызовCLI);
		ТекстCLI = Новый ТекстовыйДокумент();
		ТекстCLI.УстановитьТекст(ВызовCLI);
		ТекстCLI.Записать(ПутьCLI);
		
	Иначе

		Для каждого ПараметрМетода Из СтруктураМетода["Параметры"] Цикл
			
			Если Не ЗначениеЗаполнено(ПараметрМетода.Опция) Или Не СтруктураМетода["ЕстьCLI"] Тогда
				Сообщить("Метод не имеет опции: " + СтруктураМетода["Заголовок"]);
				Возврат;
			КонецЕсли;

			ТаблицаПараметров = ТаблицаПараметров + "  | " 
				+ ПараметрМетода.Имя + " | "
				+ ПараметрМетода.Опция + " | "
				+ ПараметрМетода.Типы  + " | "
				+ ПараметрМетода.Описание + " |"
				+ Символы.ПС;
		КонецЦикла;

		ТекстCLI = Новый ТекстовыйДокумент();
		ТекстCLI.Прочитать(ПутьCLI);

		Для Н = 1 По ТекстCLI.КоличествоСтрок() Цикл
			ТекущаяСтрока = СокрЛП(ТекстCLI.ПолучитьСтроку(Н));
			Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
				ВызовCLI = ВызовCLI + "  " + ТекущаяСтрока + Символы.ПС;
			КонецЕсли;
		КонецЦикла;

		Если ЗначениеЗаполнено(ВызовCLI) Тогда
			ВызовCLI = Лев(ВызовCLI, СтрДлина(ВызовCLI) - 1);
		КонецЕсли;
	
	КонецЕсли;

	Макет = СтрЗаменить(Макет, "@Вызов1С"          , Вызов1С);
	Макет = СтрЗаменить(Макет, "@ВызовCLI"         , ВызовCLI);
	Макет = СтрЗаменить(Макет, "@ТаблицаПараметров", ТаблицаПараметров); 

	НовыйДокумент = Новый ТекстовыйДокумент();
	НовыйДокумент.УстановитьТекст(Макет);
	НовыйДокумент.Записать(КаталогОбласти + "/" + ТранслитированноеИмя + ".md");

	СчетчикОбласти = СчетчикОбласти + 1;

КонецПроцедуры

#КонецОбласти

#Область РазборМодуля

Процедура РазобратьМодуль(ТекущийМодуль, ИмяМодуля)

	СчетчикБиблиотеки    = 1;
	ТекстМодуля          = ТекущийМодуль.ПолучитьТекст();
	СтруктураОбщихДанных = Новый Структура();
	СтруктураОбщихДанных.Вставить("ИмяМодуля", ИмяМодуля);

	ПолучитьДанныеМодуля(СтруктураОбщихДанных, ТекущийМодуль);

	Если Не ЗначениеЗаполнено(СтруктураОбщихДанных["Библиотека"]) Тогда
		Возврат;
	КонеЦесли;

	Парсер          = Новый ПарсерВстроенногоЯзыка;
	СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);

	Для Каждого Метод Из СтруктураМодуля.Объявления Цикл

		Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда
			РазобратьМетод(ТекущийМодуль, Метод, СтруктураОбщихДанных);	
		КонецЕсли;

		Если Метод.Тип = "ИнструкцияПрепроцессораОбласть" Тогда
			СписокОбластей.Добавить(Метод.Начало.НомерСтроки, Метод.Имя);
	    КонецЕсли;

	КонецЦикла;

	СписокОбластей.СортироватьПоЗначению();

КонецПроцедуры

Процедура ПолучитьДанныеМодуля(СтруктураОбщихДанных, ТекущийМодуль)

	Имя = ТекущийМодуль.ПолучитьСтроку(2);
	CLI = ТекущийМодуль.ПолучитьСтроку(3);

	Если СтрНайти(Имя, "Lib") = 0 Тогда
		Имя = "";
	Иначе 
		Имя = СтрЗаменить(Имя, "// Lib:", "");
		Имя = СокрЛП(Имя);
	КонецЕсли;

	Если СтрНайти(CLI, "CLI") = 0 Тогда
		CLI = "none";
	Иначе
		CLI = СтрЗаменить(CLI, "// CLI:", "");
		CLI = СокрЛП(CLI);
	КонецЕсли;

	Каталог = СтрЗаменить(Имя, " ", "_");

	СтруктураОбщихДанных.Вставить("Библиотека", Имя);
	СтруктураОбщихДанных.Вставить("Команда"   , CLI);
	СтруктураОбщихДанных.Вставить("Каталог"   , Каталог);

КонецПроцедуры

#КонецОбласти

#Область РазборМетода

Процедура РазобратьМетод(ТекстовыйДокумент, Метод, СтруктураДанных)

	НомерСтроки         = Метод.Начало.НомерСтроки;
	ИмяМетода           = Метод.Сигнатура.Имя;
	Объявление          = "";

	Для Н = НомерСтроки По Метод.Конец.НомерСтроки Цикл

		Часть      = СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(Н));
		Объявление = Объявление + Часть;

		Если Не ЗначениеЗаполнено(Часть) Тогда
			Прервать;
		КонецЕсли;

	КонецЦикла;
	
	Для Каждого Область Из СписокОбластей Цикл
		Если НомерСтроки > Область.Значение Тогда
			СтруктураДанных.Вставить("Область", Область.Представление);
		КонецЕсли;
	КонецЦикла;

	МассивКомментария        = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки, СтруктураДанных);
	МассивПараметров         = Новый Массив;
	МассивОписанийПараметров = Новый Массив;

	Если МассивКомментария.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, СтруктураДанных);
	СформироватьМассивОписанийПараметров(МассивПараметров, Метод, МассивОписанийПараметров);

	СтруктураДанных.Вставить("ИмяМетода" , ИмяМетода);
	СтруктураДанных.Вставить("Объявление", Объявление);
	СтруктураДанных.Вставить("Параметры" , МассивОписанийПараметров);

	СоздатьСтраницуДокументации(СтруктураДанных);

КонецПроцедуры

Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки, СтруктураДанных)

	ТекущаяСтрока       = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1);
	ТекстКомментария    = ТекущаяСтрока;
	
	Счетчик	= 1;
	Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл

		Счетчик = Счетчик + 1;

		ТекущаяСтрока    = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик);
		ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария;

	КонецЦикла;

    Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда
        СтруктураДанных.Вставить("ЕстьCLI", Ложь);
	Иначе
		СтруктураДанных.Вставить("ЕстьCLI", Истина);
    КонецЕсли;

    МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь);

    Если МассивКомментария.Количество() = 0 Тогда
		Возврат Новый Массив;
    Иначе
        МассивКомментария.Удалить(0);
    КонецЕсли;

    Возврат МассивКомментария;

КонецФункции

Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, СтруктураДанных)

	ОписаниеМетода      = "";
	ЗаписыватьПараметры = Ложь;
    ЗаписыватьОписание  = Истина;

	Счетчик = 0;
	Для Каждого СтрокаКомментария Из МассивКомментария Цикл

        Счетчик = Счетчик + 1;

        Если Не ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) Тогда
            ЗаписыватьОписание = Ложь;
        КонецЕсли;
            
        Если ЗаписыватьОписание = Истина И Счетчик > 1 Тогда
            ОписаниеМетода = СокрЛП(ОписаниеМетода) + " " + СокрЛП(СтрокаКомментария);
        КонецЕсли;

        Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда
            ЗаписыватьПараметры = Истина;
            ЗаписыватьОписание  = Ложь;

        ИначеЕсли СтрНайти(СтрокаКомментария, "Возвращаемое значение:") > 0 Тогда
			СтруктураДанных.Вставить("ВозвращаемоеЗначение", МассивКомментария[Счетчик]);
            Прервать;

        ИначеЕсли ЗаписыватьПараметры = Истина 
            И ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) 
            И Не СтрНачинаетсяС(СокрЛП(СтрокаКомментария), "*") = 0 Тогда
            
            МассивПараметров.Добавить(СтрокаКомментария);

        Иначе
            Продолжить;
        КонецЕсли;

    КонецЦикла;

	СтруктураДанных.Вставить("Описание" , ОписаниеМетода);
	СтруктураДанных.Вставить("Заголовок", СтрЗаменить(СокрЛП(МассивКомментария[0]), "!NOCLI", ""));

КонецПроцедуры

Процедура СформироватьМассивОписанийПараметров(Знач МассивПараметров, Знач Метод, МассивОписанийПараметров)

	Разделитель = "-";

	Для Каждого ПараметрМетода Из МассивПараметров Цикл

		МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь);
		КоличествоЭлементов      = МассивЭлементовПараметра.Количество();
	
		Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл
			МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]);
		КонецЦикла;
	
        Имя1С     = МассивЭлементовПараметра[0];

		Если КоличествоЭлементов >= 4 Тогда
			Имя  = "--" + МассивЭлементовПараметра[3];
		Иначе 
			Имя = "";
		Конецесли;
		Типы      = МассивЭлементовПараметра[1];

		Описание  = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]);	
		
		СтруктураПараметра = Новый Структура;
		СтруктураПараметра.Вставить("Имя"                , Имя1С);
		СтруктураПараметра.Вставить("Опция"              , Имя);
		СтруктураПараметра.Вставить("Типы"               , Типы);
		СтруктураПараметра.Вставить("Описание"           , Описание);
		СтруктураПараметра.Вставить("ЗначениеПоУмолчанию", ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод));

		МассивОписанийПараметров.Добавить(СтруктураПараметра);
         
    КонецЦикла;

КонецПроцедуры

#КонецОбласти

#Область Инструменты

Функция ПолучитьВызов1С(Модуль, Метод)

	Результат = "";

	ИмяКаталога = СтрЗаменить(Модуль, "OPI_", "");
	ИмяФайла    = Метод + ".txt";

	ПутьПримера = КаталогПримеров + ИмяКаталога + "/" + ИмяФайла;
	ФайлПримера = Новый Файл(ПутьПримера);

	Если ФайлПримера.Существует() Тогда
		ТекстПримера = Новый ТекстовыйДокумент();
		ТекстПримера.Прочитать(ПутьПримера);

		Результат = "";

		Для Н = 1 По ТекстПримера.КоличествоСтрок() Цикл
	
			ТекущаяСтрока = СокрЛП(ТекстПримера.ПолучитьСтроку(Н));
			Результат = Результат + "  " + ТекущаяСтрока + Символы.ПС;
	
		КонецЦикла;
	
		Если ЗначениеЗаполнено(Результат) Тогда
			Результат = Лев(Результат, СтрДлина(Результат) - 1);

			Пока СтрНайти(Результат, Символы.ПС + Символы.ПС) <> 0 Цикл
				Результат = СтрЗаменить(Результат, Символы.ПС + Символы.ПС, Символы.ПС);
			КонецЦикла;
			
		КонецЕсли;

	КонецЕсли;

	Возврат Результат;

КонецФункции

Функция ОпределитьЗначениеОпции(Опция, Значение = "")

	Если ЗначениеЗаполнено(Значение) Тогда
		Опция = """" + Строка(Значение) + """";
	Иначе
		Опция = "%" + СтрЗаменить(Опция, "-", "") + "%";
	КонецЕсли;

	Возврат Опция;

КонецФункции

Процедура ПроверитьСоздатьКаталог(Путь)

	Каталог = Новый Файл(Путь);

	Если Не Каталог.Существует() Тогда
		СоздатьКаталог(Путь);
    КонецЕсли;

КонецПроцедуры

Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод)

    Значение = "";

    Для Каждого ПараметрМетода Из Метод.Сигнатура.Параметры Цикл

        Если ПараметрМетода.Имя = Имя Тогда

            ЗначениеПараметра = ПараметрМетода.Значение;
            Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда
                Попытка
                    Значение = ЗначениеПараметра["Элементы"][0]["Значение"];
                Исключение 
                    Значение = ЗначениеПараметра.Значение;
                КонецПопытки;
                Значение = ?(ЗначениеЗаполнено(Значение), Значение, "Пустое значение");
            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

    Возврат Значение;

КонецФункции

Функция ТранслитироватьСтроку(Знач Значение)

	Значение     = нРег(Значение);

	Для Каждого ЗаменяемыйСимвол Из Транслитация Цикл
		Значение = СтрЗаменить(Значение, ЗаменяемыйСимвол.Ключ, ЗаменяемыйСимвол.Значение);
	КонецЦикла;

	Значение = ВРег(Лев(Значение,1)) + Сред(Значение,2);
	Возврат Значение;

КонецФункции

Функция ПеревестиИмя(Значение)

	ПереведенноеИмя = Словарь[Значение];

	Если Не ЗначениеЗаполнено(ПереведенноеИмя) Тогда
		ПереведенноеИмя = ТранслитироватьСтроку(Значение);
		ПереведенноеИмя = СтрЗаменить(ПереведенноеИмя, "(", "");
		ПереведенноеИмя = СтрЗаменить(ПереведенноеИмя, ")", "");
		ПереведенноеИмя = СтрЗаменить(ПереведенноеИмя, "-", " ");
	КонецЕсли;

	Возврат ПереведенноеИмя;

КонецФункции

 Функция Синонимайзер(ИмяРеквизита)
    
    Перем Синоним, ъ, Символ, ПредСимвол, СледСимвол, Прописная, ПредПрописная, СледПрописная, ДлинаСтроки;
    
    Синоним = ВРег(Сред(ИмяРеквизита, 1, 1));
    ДлинаСтроки = СтрДлина(ИмяРеквизита);
    Для ъ=2 По ДлинаСтроки Цикл
        Символ = Сред(ИмяРеквизита, ъ, 1);
        ПредСимвол = Сред(ИмяРеквизита, ъ-1, 1);
        СледСимвол = Сред(ИмяРеквизита, ъ+1, 1);
        Прописная = Символ = ВРег(Символ);
        ПредПрописная = ПредСимвол = ВРег(ПредСимвол);
        СледПрописная = СледСимвол = ВРег(СледСимвол);
        
        // Варианты:
        Если НЕ ПредПрописная И Прописная Тогда
            Синоним = Синоним + " " + Символ;
        ИначеЕсли Прописная И НЕ СледПрописная Тогда
            Синоним = Синоним + " " + Символ;
        Иначе
            Синоним = Синоним + Символ;
        Конецесли;
    КонецЦикла;

	Синоним = ВРег(Лев(Синоним,1)) + нРег(Сред(Синоним,2));
    
    Возврат Синоним;
    
КонецФункции

Функция ПолучитьРезультатМетода(Знач Раздел, Знач Метод)

	Результат           = "";
	ПутьКаталогаРаздела = КаталогЛогов + Раздел;
	КаталогРаздела      = Новый Файл(ПутьКаталогаРаздела);

	Если Не КаталогРаздела.Существует() Тогда
		Возврат Результат;
	КонецЕсли;

	ПутьЛога = ПутьКаталогаРаздела + "/" + Метод + ".log";
	ФайлЛога = Новый Файл(ПутьЛога);

	Если Не ФайлЛога.Существует() Тогда
		Возврат Результат;
	КонецЕсли;

	ДокументЛога = Новый ТекстовыйДокумент();
	ДокументЛога.Прочитать(ПутьЛога);

	Результат = "";

	Для Н = 1 По ДокументЛога.КоличествоСтрок() Цикл

		ТекущаяСтрока = ДокументЛога.ПолучитьСтроку(Н);

		Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
			Результат = Результат + ТекущаяСтрока + Символы.ПС;
		КонецЕсли;

	КонецЦикла;

	Если ЗначениеЗаполнено(Результат) Тогда
		Результат = Лев(Результат, СтрДлина(Результат) - 1);
	КонецЕсли;

	Возврат СокрЛП(Результат);

КонецФункции

Процедура ПолучитьТаблицуТранслитации()

	Транслитация = Новый Соответствие();
	
	Транслитация.Вставить("а", "a");
	Транслитация.Вставить("б", "b");
	Транслитация.Вставить("в", "v");
	Транслитация.Вставить("г", "g");
	Транслитация.Вставить("д", "d");
	Транслитация.Вставить("е", "e");
	Транслитация.Вставить("ё", "e");
	Транслитация.Вставить("ж", "zh");
	Транслитация.Вставить("з", "z");
	Транслитация.Вставить("и", "i");
	Транслитация.Вставить("й", "y");
	Транслитация.Вставить("к", "k");
	Транслитация.Вставить("л", "l");
	Транслитация.Вставить("м", "m");
	Транслитация.Вставить("н", "n");
	Транслитация.Вставить("о", "o");
	Транслитация.Вставить("п", "p");
	Транслитация.Вставить("р", "r");
	Транслитация.Вставить("с", "s");
	Транслитация.Вставить("т", "t");
	Транслитация.Вставить("у", "u");
	Транслитация.Вставить("ф", "f");
	Транслитация.Вставить("х", "h");
	Транслитация.Вставить("ц", "ts");
	Транслитация.Вставить("ч", "ch");
	Транслитация.Вставить("ш", "sh");
	Транслитация.Вставить("щ", "sch");
	Транслитация.Вставить("ъ", "");
	Транслитация.Вставить("ы", "y");
	Транслитация.Вставить("ь", "");
	Транслитация.Вставить("э", "e");
	Транслитация.Вставить("ю", "u");
	Транслитация.Вставить("я", "ya");

КонецПроцедуры

Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник)
	
	СоздатьКаталог(КаталогПриемник);
	
	МассивФайлов = НайтиФайлы(КаталогИсточник, "*.*", Истина);
	
	Для Каждого Файл Из МассивФайлов Цикл

		Если СтрНайти(Файл.ПолноеИмя, "cli") <> 0 Тогда
			Продолжить;
		КонецЕсли;

		ПолноеИмяИсточник = Файл.ПолноеИмя;
		ПолноеИмяПриемник = КаталогПриемник + СтрЗаменить(Файл.ПолноеИмя, КаталогИсточник, "");
		
		Если Файл.ЭтоКаталог() Тогда
			СоздатьКаталог(ПолноеИмяПриемник);	
		Иначе

			Если Файл.Расширение = ".gif" Или Файл.Расширение = ".png" Тогда
				ФайлПриемник = Новый Файл(ПолноеИмяПриемник);
				Если ФайлПриемник.Существует() Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;

			
			КопироватьФайл(ПолноеИмяИсточник, ПолноеИмяПриемник);
		КонецЕсли;
	КонецЦикла;	
	
КонецПроцедуры

#КонецОбласти

#Область Локализация

Процедура ПеревестиДокументацию()

	Сообщить("////////////////////////////////////////////////");
	Сообщить("");
	Сообщить("Начало перевода...");
	Сообщить("");

	СоответствиеЗаголовков.Вставить("Начало работы", "Getting started");
	
	ФайлКаталогаДокументации = Новый Файл(КаталогДокументации);
	ФайлКаталогаЛокализации  = Новый Файл(КаталогЛокализации);

	//УдалитьФайлы(ФайлКаталогаЛокализации.ПолноеИмя);
	СкопироватьФайлы(ФайлКаталогаДокументации.ПолноеИмя, ФайлКаталогаЛокализации.ПолноеИмя);

	ТаблицаСловаря = Новый ТаблицаЗначений();
	ТаблицаСловаря.Колонки.Добавить("Ключ");
	ТаблицаСловаря.Колонки.Добавить("Значение");
	ТаблицаСловаря.Колонки.Добавить("Длина");

	Для Каждого КлючевоеСлово Из Словарь Цикл
		НоваяСтрокаСловаря = ТаблицаСловаря.Добавить();
		НоваяСтрокаСловаря.Ключ      = КлючевоеСлово.Ключ;
		НоваяСтрокаСловаря.Значение  = КлючевоеСлово.Значение;
		НоваяСтрокаСловаря.Длина     = СтрДлина(КлючевоеСлово.Ключ);
	КонецЦикла;

	ТаблицаСловаря.Сортировать("Длина УБЫВ");

	ФайлыЛокализации = НайтиФайлы(ФайлКаталогаЛокализации.ПолноеИмя, "*.md", Истина);
	JsonЛокализации  = НайтиФайлы(ФайлКаталогаЛокализации.ПолноеИмя, "*.json", Истина);
	JSЛокализации    = НайтиФайлы(ФайлКаталогаЛокализации.ПолноеИмя, "*.js", Истина);
	
	Для Каждого JSON из JsonЛокализации Цикл
		ФайлыЛокализации.Добавить(JSON);
	КонецЦикла;

	Для Каждого JS из JSЛокализации Цикл
		ФайлыЛокализации.Добавить(JS);
	КонецЦикла; 

	Для Каждого Файл Из ФайлыЛокализации Цикл

		Если Файл.ЭтоКаталог() Тогда
			Продолжить;
		КонецЕсли;

		Если Файл.Имя = "_category_.json" Тогда

			ФайлКатегории = Файл.ПолноеИмя;

			
			ЧтениеJSON = Новый ЧтениеJSON();
			ЧтениеJSON.ОткрытьФайл(ФайлКатегории);
			СтруктураКатегории = ПрочитатьJSON(ЧтениеJSON, Истина);
			ЧтениеJSON.Закрыть();

			ЛокализированныйЗаголовок = СоответствиеЗаголовков[СтруктураКатегории["label"]];

			Если ЗначениеЗаполнено(ЛокализированныйЗаголовок) Тогда
				СтруктураКатегории.Вставить("label", ЛокализированныйЗаголовок);
			КонецЕсли;
			
			Запись = Новый ЗаписьJSON;
			ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);
			Запись.ОткрытьФайл(ФайлКатегории, , , ПараметрыЗаписиJSON);
			ЗаписатьJSON(Запись, СтруктураКатегории);
			Запись.Закрыть();

		Иначе

			ТекущийДокумент = Новый ТекстовыйДокумент();
			ТекущийДокумент.Прочитать(Файл.ПолноеИмя, "UTF-8");
			ТекстДокумента = ТекущийДокумент.ПолучитьТекст();

			Для Каждого Слово Из ТаблицаСловаря Цикл
				ТекстДокумента = СтрЗаменить(ТекстДокумента, Слово.Ключ, Слово.Значение);
			КонецЦикла;

			Пока СтрНайти(ТекстДокумента, "  ") <> 0 Цикл
				ТекстДокумента = СтрЗаменить(ТекстДокумента, "  ", " ");
			КонецЦикла;

			ТекстДокумента = СтрЗаменить(ТекстДокумента, " ,", ",");

			ТекущийДокумент.УстановитьТекст(ТекстДокумента);
			ТекущийДокумент.Записать(Файл.ПолноеИмя);

		КонецЕсли;

			Для Каждого Буква Из Транслитация Цикл
				Если СтрНайти(ТекстДокумента, Буква.Ключ) <> 0 Тогда
					Сообщить("Ошибка перевода | " + Файл.ПолноеИмя);
					Прервать;
				КонецЕсли;
			КонецЦикла;


	
	КонецЦикла;
	
	Сообщить("Перевод завершен!");

КонецПроцедуры

#КонецОбласти

#КонецОбласти

//ПриСозданииОбъекта();